//
//  NetworkTools.swift
//  AFN框架的封装
//
//  Created by 刘伟 on 16/4/27.
//  Copyright © 2016年 刘伟. All rights reserved.
//

import UIKit
import AFNetworking

/*
    单例:两种单例
    1.不管如何创建,只有一份实例
    2.通过同一个方法拿到的是同一个实例,但是可以通过其他方法创建一个新的对象
*/

// MARK: - 定义网络请求类型的枚举
enum RequestType{
    case GET
    case POST
}


class NetworkTools: AFHTTPSessionManager {
    
//    1.将NetworkTools设计为单例
//    这里其实使用的是闭包,然后再直接调用,然后给shareInstance赋值
//    static :在内存中只有一份内存地址
    static let shareInstance : NetworkTools = {
        
        let tools = NetworkTools()
        tools.responseSerializer.acceptableContentTypes?.insert("text/html")
        return tools
    }()
    
}


// MARK: - 封装网络请求
extension NetworkTools{

    func request (requestType : RequestType ,urlSting : String, parameters : [String : AnyObject], finished : (result : AnyObject? , error: NSError?) -> ()) ->(){
    

//        1.成功后的回调
        let successCallBack = { (task : NSURLSessionDataTask, result : AnyObject?) -> Void in
            finished(result: result, error: nil)
        }
        
        
//        2.失败后的回调
        let failueCallBack =  { (task : NSURLSessionDataTask?, error : NSError) -> Void in
            finished(result: nil, error: error)
        }
        
//        3.发送网络请求
        if requestType == .GET{
            GET(urlSting, parameters: parameters, progress: nil, success:successCallBack , failure:failueCallBack)
        
        }else{
            POST(urlSting, parameters: parameters, progress: nil, success: successCallBack, failure: failueCallBack)
        }
    }
    
}


// MARK: - 请求首页数据
extension NetworkTools{

    func loadHomeData(offset : Int ,finished : (result : [[String : AnyObject]]? , error: NSError?) -> ()){
    
    
//        1.获取URL的urlstring
        let urlstring = "http://mobapi.meilishuo.com/2.0/twitter/popular.json"
    
//        2.设置请求信息s
        let parameters = ["offset" : "\(offset)", "limit" : "30", "access_token" : "b92e0c6fd3ca919d3e7547d446d9a8c2"]

        
//        3.发送网络请求
        request(.GET, urlSting: urlstring, parameters: parameters) { (result, error) -> () in

//            1.判断是否有错误
            if error != nil{
                finished(result: nil, error: error)
            }
            
//            2.获取结果
            guard let result = result as? [String : AnyObject] else{
            finished(result: nil, error: NSError(domain: "data error", code: 4004, userInfo: nil ))
                return
            }
            
//            3.将结果回调
            finished(result: result["data"] as? [[String : AnyObject]] , error: nil)

            
        }
    }
}
















